package Y20251126;

class Solution {


    /**
     * 只出现一次的数，在一个数组中，只有一个数只出现过一次，找到这个数，其他数皆出现3次
     * 解法：
     * 可以定义一个数ret来计算返回，通过每一位的和来计算ret这一位的值，这一位的值可以++，最后%即可
     * 优化，则可以判断sum这个和是否是1，是1在修改ret，否则没必要
     * @param nums
     * @return
     */
    public int singleNumber(int[] nums) {
        int ret = 0;
        for(int i = 0; i < 32; i++){
            int sum = 0;
            for(int x : nums)
                if(((x>>i) & 1) == 1)
                    sum++;
            sum %= 3;
            if(sum == 1)
                ret |= 1 << i;
        }
        return ret;
    }

    /** 两个整数的和 不用+.-符号
     * 可以用位运算的^.& ^也可以通过无进位运算
     * 交替使用^.&，直到(tmp&b)<<1为0,a就是最后的结果
     * @param a
     * @param b
     * @return
     */
    public int getSum(int a, int b) {
        while(b != 0){
            int tmp = a;
            a=tmp^b;
            b=(tmp&b)<<1;
        }
        return a;
    }
}